/*
* File: CLogger.h
* Copyright (c) 2010. Silviu Caragea <silviu@intelliproject.net>
* Created on Aug 23, 2010, 11:14 PM
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*  1.Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
*  2.Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*  3.All advertising materials mentioning features or use of this software
*    must display the following acknowledgement:
*       This product includes software developed by the University of
*       California, Berkeley and its contributors.
*  4.Neither the name of the University nor the names of its contributors
*    may be used to endorse or promote products derived from this software
*    without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED.IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
* OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef CLOGGER_H_
#define CLOGGER_H_

#include <errno.h>
#include <fcntl.h>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>

#ifdef WIN32
    #include <io.h>
#else
    #include <unistd.h>
#endif

#include "../config.h"
#include "CCriticalSection.h"

/*
#ifdef __APPLE__

#endif
*/

namespace litevent{
namespace util{

#define LOGGER_BUFFER_SIZE 2048

class CLogger
{
public:

    static CLogger *sharedLogger();
    ~CLogger();

    bool openLog(const char* szFilePath, bool bLogging);
    void closeLog();

    void Write(const char* szText);
    void WriteFormated(const char* szFormat, ...);

    void SetIsActiveLogger(const bool bLogging);
    bool GetActiveLogger();

    bool isOpen();

private:
    CLogger();
    static CLogger* m_pInstance;

    bool m_bLogging;
    CCriticalSection m_crtSection;

#ifndef HAVE_CONSOLE_LOGGER
    int fd;
#endif

    char *msgBuffer;
};

inline void CLogger::closeLog()
{
#ifndef HAVE_CONSOLE_LOGGER
    m_crtSection.lock();

    if (this->fd != -1)
    {
#ifdef WIN32
		_close(this->fd);
#else
        close(this->fd);
#endif
        this->fd = -1;
    }

    m_crtSection.unlock();
#endif
}

inline void CLogger::SetIsActiveLogger(const bool bLogging)
{
    m_crtSection.lock();
    this->m_bLogging = bLogging;
    m_crtSection.unlock();
}

inline bool CLogger::GetActiveLogger()
{
    m_crtSection.lock();
    return this->m_bLogging;
    m_crtSection.unlock();
}

inline bool CLogger::isOpen()
{
    m_crtSection.lock();
#ifndef HAVE_CONSOLE_LOGGER
    return (this->fd != -1);
#else
    return true;
#endif
    m_crtSection.unlock();
}

}}//namespace end

#endif /* CLOGGER_H_ */
